/**
 * Listening to routes alone would waste rendering performance. Use the publish-subscribe model for distribution management
 * 单独监听路由会浪费渲染性能。使用发布订阅模式去进行分发管理。
 */
import mitt, { Handler } from 'mitt';
import type { RouteLocationNormalized } from 'vue-router';

// 创建一个mitt实例
const emitter = mitt();

// 创建一个Symbol类型的key，用于标识路由变化
const key = Symbol('ROUTE_CHANGE');

// 定义一个变量，用于存储最新的路由
let latestRoute: RouteLocationNormalized;

// 设置路由变化的函数
export function setRouteEmitter(to: RouteLocationNormalized) {
  // 发射路由变化的key，并传入最新的路由
  emitter.emit(key, to);
  // 更新最新的路由
  latestRoute = to;
}

// 监听路由变化的函数
export function listenerRouteChange(
  handler: (route: RouteLocationNormalized) => void,
  immediate = true
) {
  // 监听路由变化的key，并传入处理函数
  emitter.on(key, handler as Handler);
  // 如果immediate为true，并且latestRoute存在，则立即调用处理函数
  if (immediate && latestRoute) {
    handler(latestRoute);
  }
}

// 移除路由监听的函数
export function removeRouteListener() {
  // 移除路由变化的key的监听
  emitter.off(key);
}
